//
// Created by 32827 on 2023/11/21.
//

#ifndef YZFRAME_YZF_I2C_H
#define YZFRAME_YZF_I2C_H
#include "yzf.h"
#define YZF_I2C_Write 0
#define YZF_I2C_Read 1
#define YZF_I2C_PEC_DATA uint8_t
typedef uint8_t YZF_I2C_DATA;

#define YZF_I2C0 HR_I2C_BASE_ADDR
//开启i2c
YZF_RESULT yzf_i2c_open(YZF_I2C_POINTER i2c);
//设置输入时钟频率
YZF_RESULT yzf_i2c_source_clock_freq(YZF_I2C_POINTER i2c,uint32_t freq);
//设置起始位
YZF_RESULT yzf_i2c_start(YZF_I2C_POINTER i2c);
//写入数据
YZF_RESULT yzf_i2c_write_data(YZF_I2C_POINTER i2c,YZF_I2C_DATA data);
//读取数据
YZF_I2C_DATA yzf_i2c_read_data(YZF_I2C_POINTER i2c);
//设置10位地址
YZF_RESULT yzf_i2c_set_address_10(YZF_I2C_POINTER i2c,uint16_t address);
//设置7位地址
YZF_RESULT yzf_i2c_set_address_7(YZF_I2C_POINTER i2c,uint8_t address);
//软件复位，BUSY位为1，总线上没有停止条件 逻辑死循环时
YZF_RESULT yzf_i2c_soft_reset(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_soft_reset_clear(YZF_I2C_POINTER i2c);
//应答使能
YZF_RESULT yzf_i2c_ack_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_ack_disable(YZF_I2C_POINTER i2c);
//停止条件产生 记得取消ack
YZF_RESULT yzf_i2c_stop(YZF_I2C_POINTER i2c);
//禁止时钟延长（从模式）
YZF_RESULT yzf_i2c_disable_clock_stretching(YZF_I2C_POINTER i2c);
//广播呼叫使能 响应地址00h
YZF_RESULT yzf_i2c_call_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_call_disable(YZF_I2C_POINTER i2c);
//PEC使能
YZF_RESULT yzf_i2c_pec_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_pec_disable(YZF_I2C_POINTER i2c);
//APR使能
YZF_RESULT yzf_i2c_apr_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_apr_disable(YZF_I2C_POINTER i2c);
//i2c使能
YZF_RESULT yzf_i2c_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_disable(YZF_I2C_POINTER i2c);
//DMA最后一次传输
YZF_RESULT yzf_i2c_dma_last_transfer(YZF_I2C_POINTER i2c);
//DMA请求使能
YZF_RESULT yzf_i2c_dma_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_dma_disable(YZF_I2C_POINTER i2c);
//缓冲器中断使能，控制TxE RxNE
YZF_RESULT yzf_i2c_buffer_interrupt_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_buffer_interrupt_disable(YZF_I2C_POINTER i2c);
//事件中断使能 传输非错误事件中断，都要他来设置
YZF_RESULT yzf_i2c_event_interrupt_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_event_interrupt_disable(YZF_I2C_POINTER i2c);
//双地址使能
YZF_RESULT yzf_i2c_address2_enable(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_address2_disable(YZF_I2C_POINTER i2c);
//设置第二个地址
YZF_RESULT yzf_i2c_set_address2(YZF_I2C_POINTER i2c,uint8_t address);
//FLAG Timeout
YZF_BOOL yzf_i2c_flag_timeout(YZF_I2C_POINTER i2c);
//FLAG PECERR PEC错误
YZF_BOOL yzf_i2c_flag_PECERR(YZF_I2C_POINTER i2c);
//FLAG OVR 过载或者欠载
YZF_BOOL yzf_i2c_flag_OVR(YZF_I2C_POINTER i2c);
//FLAG AF 应答失败
YZF_BOOL yzf_i2c_flag_AF(YZF_I2C_POINTER i2c);
//仲裁丢失
YZF_BOOL yzf_i2c_flag_ARLO(YZF_I2C_POINTER i2c);
//总线出错
YZF_BOOL yzf_i2c_flag_BERR(YZF_I2C_POINTER i2c);
//数据寄存器为空(发送时)
YZF_BOOL yzf_i2c_flag_TxE(YZF_I2C_POINTER i2c);
//数据寄存器非空(发送时)
YZF_BOOL yzf_i2c_flag_RxNE(YZF_I2C_POINTER i2c);
//停止条件检测为
YZF_BOOL yzf_i2c_flag_STOPF(YZF_I2C_POINTER i2c);
//ADD10位头序列已发送
YZF_BOOL yzf_i2c_flag_add10(YZF_I2C_POINTER i2c);
//字发送结束
YZF_BOOL yzf_i2c_flag_BTF(YZF_I2C_POINTER i2c);
//地址已发送/地址匹配
YZF_BOOL yzf_i2c_flag_ADDR(YZF_I2C_POINTER i2c);
//起始位
YZF_BOOL yzf_i2c_flag_SB(YZF_I2C_POINTER i2c);
//PEC出错时与上PEC对应
YZF_I2C_PEC_DATA yzf_i2c_get_pec(YZF_I2C_POINTER i2c);
//双标志
YZF_BOOL yzf_i2c_flag_DUALF(YZF_I2C_POINTER i2c);
//广播呼叫地址
YZF_BOOL yzf_i2c_flag_GENCALL(YZF_I2C_POINTER i2c);
//发送/接收标志位 False为接收到数据
YZF_BOOL yzf_i2c_flag_TRA(YZF_I2C_POINTER i2c);
//总线繁忙
YZF_BOOL yzf_i2c_flag_BUSY(YZF_I2C_POINTER i2c);
//主从模式 0为从
YZF_BOOL yzf_i2c_flag_MSL(YZF_I2C_POINTER i2c);
//高速模式
YZF_RESULT yzf_i2c_set_high_mode(YZF_I2C_POINTER i2c);
//标准模式
YZF_RESULT yzf_i2c_set_normal_mode(YZF_I2C_POINTER i2c);
//快速模式占空比
YZF_RESULT yzf_i2c_duty_cycle_2(YZF_I2C_POINTER i2c);
YZF_RESULT yzf_i2c_duty_cycle_16_9(YZF_I2C_POINTER i2c);
//分频系数
YZF_RESULT yzf_i2c_set_CCR(YZF_I2C_POINTER i2c,uint16_t ccr);
//最大上升时间
YZF_RESULT yzf_i2c_trise(YZF_I2C_POINTER i2c,uint16_t trise);
#endif //YZFRAME_YZF_I2C_H